package com.example.library.utils;

import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.library.common.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * <p>
 * Token 工具类
 * </p>
 *
 * 该类提供用于验证 JWT Token 的方法。
 * 它通过 Redis 存储和验证用户 Token，确保请求的合法性。
 */
@Component
public class TokenUtil {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 验证 Token
     *
     * 该方法用于验证请求中的 Token 是否有效。
     * 它解析 Token 并检查其是否存在于 Redis 中，确保 Token 的有效性。
     *
     * @param authorizationHeader 请求头中的授权信息，包含 JWT Token
     * @return Token 验证结果的 Result 对象
     */
    public Result<String> validateToken(String authorizationHeader) {
        try {
            // 从请求头中提取 Token，移除 "Bearer " 前缀
            String token = authorizationHeader;

            // 解析 Token 获取声明信息
            Map<String, Claim> claims = JwtUtil.parseToken(token);
            Claim userNameClaim = claims.get("userName");

            // 检查 userName 是否存在且有效
            if (userNameClaim == null || userNameClaim.asString() == null) {
                return Result.error(401, "Token is invalid: userId is missing");
            }

            String userName = userNameClaim.asString();

            // 从 Redis 中查找 Token
            String redisToken = redisTemplate.opsForValue().get("token:" + userName);

            // 验证 Token 是否匹配
            if (redisToken != null && redisToken.equals(token)) {
                return Result.success("Token is valid");
            } else {
                return Result.error(401, "Token is invalid or expired");
            }
        } catch (Exception e) {
            // 捕获异常并记录错误信息
            System.err.println("Token validation failed: " + e.getMessage());
            return Result.error(401, "Invalid or expired token");
        }
    }
    public String getClaimFromToken(String token, String claimKey) {
        try {
            Map<String, Claim> claims = JwtUtil.parseToken(token);  // 调用 JwtUtil 中的 parseToken 方法
            Claim claim = claims.get(claimKey);  // 从 Map 中获取对应的 Claim
            System.out.println(claim);
            return claim != null ? claim.asString() : null;  // 判断 Claim 是否存在
        } catch (Exception e) {
            return null;  // 如果解析出错或者 Claim 不存在，返回 null
        }
    }


}
